package com.study.leetcode;

import java.util.ArrayDeque;
import java.util.Queue;

public class Solution_207 {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        //    统计每个课被指向次数，初始被指向次数为0的肯定是安全的（不在环上）。
        //    每被安全课程指向一次，被指次数减一，
        //    如果被指次数减到0，说明该课程全部指向都来自安全课程，则它也是安全的。
        //    依此进行队列循环。
        int len = prerequisites.length;
        if (len == 0) {
            return true;
        }
        int[] pointer = new int[numCourses];
        Queue<int[]> queue = new ArrayDeque<>(len);
        for (int[] p : prerequisites) {
            ++pointer[p[1]];
            queue.offer(p);
        }
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] p = queue.poll();
                if (pointer[p[0]] == 0) {
                    --pointer[p[1]];
                } else {
                    queue.offer(p);
                }
            }
            if (size == queue.size()) {
                return false;
            }
        }
        return true;

    }
    
   
    public static void main(String[] args) {

    }
}
